昨天說到如何新增一個DataFrame,也說到每個一欄位都是一個series,接下來不能免俗的要介紹欄位的修改,這個在Pandas中最常見的操作,身為靈活的功夫熊貓,自然不會只有一個招式,條條大路通修改。
首先,我們先手動新增一個DataFrame
df = pd.DataFrame({"name":["Mary","John","Cindy"], "salary":[50000,72000,89000]})
非常直接,用方括號指定欄位名稱就可以了,data可以是常數值,也可以來自另一個欄位再做運算。如果是常數值,就會整個series都是相同的值,新增跟修改是一樣的,欄位存在就覆蓋,不存在就新增。
df["annual_salary"] = df["salary"] * 14
df["department"] = "Sales Dept"
index | name | salary | annual_salary | department |
---|---|---|---|---|
0 | Mary | 50000 | 700000 | Sales Dept |
1 | John | 72000 | 1008000 | Sales Dept |
2 | Cindy | 89000 | 1246000 | Sales Dept |
assign會返回一個新的物件,使用上會是更安全的選擇,同時它可以一次新增多個欄位,它的語法是
df.assign(欄位1 = 欄位值1, 欄位2 = 欄位值2, 欄位3 = 欄位值3....)
欄位值可以是常數,可是另一個欄位的加總,也可以是lambda語句
# 以下兩個語句 效果一樣
df2 = df.assign(annual_salary = df["salary"] *14,
department = "Sales Dept")
df2 = df.assign(annual_salary = lambda d: d["salary"] *14,
department = "Sales Dept")
assign同樣適用,欄位存在就覆蓋,不存在就新增
刪除的部分可以用跟python一樣的用法的pop/del,也可以用df.drop
簡直粗暴解,沒有回頭路,
del df["department"]
pop在python一樣,刪除的同時回傳欄位,可以對欄位做後續的加工處理再塞回去dataframe
annual_salary_col = df.pop("annual_salary")
drop和assign一樣是會回傳一個新物件,是比較安全的選擇
(當然如果用原變數去接的話就是另一個故事了)
column是一個陣列,可以一次刪除多個欄位
df2 = df.drop(columns=["annual_salary","department"])
欄位rename只要給columns屬性一個dictionary就可以一次修改多欄
df2 = df.rename(columns={"annual_salary":"year_salary", "department":"dept"})
但rename也不只能修改columns,它也可以修改index
index_dict = {"Mary":"Taylor", "John": "Johnny", "Cindy": "Cindy Baby"}
column_dict = {"annual_salary":"year_salary", "department":"dept"}
df2 = df.set_index('name').rename(index= index_dict, columns=column_dict)
意思是先set index為欄位name,再重設column和index
(index:name) | salary | year_salary | dept |
---|---|---|---|
Taylor | 50000 | 700000 | Sales Dept |
Johnny | 72000 | 1008000 | Sales Dept |
Cindy Baby | 89000 | 1246000 | Sales Dept |
這裡會有個小小的疑問,為什麼df可以先點set_index,再點rename。
保安!可以這樣點了又點、點了再點嗎?
什麼是 Method Chaining 方法鏈 ?
Method Chaining 指的是把多個 DataFrame 操作串成一條鏈,像管線 (pipeline) 一樣依序處理。在操作csv或excel,很難避免為了得到某個最終的結果,中間需要做很多加工的過程,在傳統工法中每一段加工就是一行,有了method chaining,流程能更一目了然,程式的可讀性也更高。
Before Method Chaining
df = df[df["sales"] > 100]
df["profit"] = df["sales"] - df["cost"]
df = df.groupby("dept")["profit"].mean().reset_index()
After Method Chaining
df = (
df
.query("sales > 100")
.assign(profit=lambda d: d["sales"] - d["cost"])
.groupby("dept")["profit"].mean()
.reset_index()
)
是不是太elegant了!
鏈很美好,但需適度服用,過猶不及,請勿為鏈而鏈
下集預告:繼續深扒DataFrame....